package com.qf.smsplatform.strategy.service.impl;

import com.qf.smsplatform.common.constants.CacheConstants;
import com.qf.smsplatform.common.constants.OperatorConstants;
import com.qf.smsplatform.common.model.StandardSubmit;
import com.qf.smsplatform.strategy.service.Strategy;
import com.qf.smsplatform.strategy.service.api.CacheService;
import com.qf.smsplatform.strategy.util.CheckMobileOperator;
import com.qf.smsplatform.strategy.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Set;

/**
 * 号段补齐策略
 */
@Service(value = "phase")
@Slf4j
public class MobilePhaseStrategy implements Strategy {

    @Autowired
    private CacheService cacheService;


    @Override
    public boolean strategy(StandardSubmit submit) {
        log.info("【策略模块】 号段补齐策略开始执行！！！");
        //1. 判断出手机对应的运营商（正则）
        String mobile = submit.getDestMobile();

        if(CheckMobileOperator.isChinaMobilePhoneNum(mobile)){
            // 手机号是移动
            submit.setOperatorId(OperatorConstants.CHINA_MOBILE);
        }else if(CheckMobileOperator.isChinaUnicomPhoneNum(mobile)){
            // 手机号是联通
            submit.setOperatorId(OperatorConstants.CHINA_UNICOM);
        }else if(CheckMobileOperator.isChinaTelecomPhoneNum(mobile)){
            // 手机号是电信
            submit.setOperatorId(OperatorConstants.CHINA_TELECOM);
        }else{
            // 未知
            submit.setOperatorId(OperatorConstants.CHINA_UNKNOWN);
        }

        //=============================白嫖的同步操作，同步速度特别慢，可能有坑~~~~=================================================
        //2. 需要查询出手机对应的省市区域（Redis查询）缓存同步时,不要使用&连接省和市,
        // 将PHASE:1888888 作为Redis中key的前缀,对应的value是 省id,市id
        // 封装key
        String key = CacheConstants.CACHE_PREFIX_PHASE + mobile.substring(0,7);
        // 根据key查询数据
        String value = cacheService.get(key);
        // 处理value值,     省id,市id
        String[] provinceAndCity = value.split(",");
        submit.setProvinceId(Integer.valueOf(provinceAndCity[0]));
        submit.setCityId(Integer.valueOf(provinceAndCity[1]));

        // ==============================================================================
        // 需要查询出当前手机发送短信需要使用客户绑定的哪个通道（Redis查询）
        // 依据手机号的运行商去选择指定的通道（客户绑定了），如果没有找到适用的通道，直接选择全网通
        // 1. 获取当前客户绑定的全部通道。
        Set<String> channels = cacheService.smembers(CacheConstants.CACHE_PREFIX_SMS_CHANNEL + submit.getClientID());

        //2. 根据手机号的运营商，找到匹配的通道。
        for (String channel : channels) {
            // 将JSON字符串转为Map集合
            Map<String, Object> map = JsonUtils.json2Object(channel,Map.class);
            // 如果是全网通,就直接先设置进去
            if(0 == (Integer) map.get("channelType")){
                // 是全网通,如果是全网通,就直接根据全网通设置信息,如果能匹配上其他通道,优先使用其他通道
                String srcNumber = (String)map.get("spNumber") + (String)map.get("extendNumber");
                submit.setSrcNumber(srcNumber);
                submit.setGatewayID((Integer) map.get("channelId"));
                // Integer -> Long    ==  Integer -> String -> Long
                submit.setFee(Long.parseLong( map.get("fee") + ""));
            }
            // 判断当前通道的运营商是否和手机号的运营商匹配
            if(submit.getOperatorId() == (Integer) map.get("channelType") && 0 != (Integer) map.get("channelType")){
                // 当前通道，匹配上了手机号的运营商
                //3. 根据查询到的通道信息，对数据进行封装。
                String srcNumber = (String)map.get("spNumber") + (String)map.get("extendNumber");
                submit.setSrcNumber(srcNumber);
                submit.setGatewayID((Integer) map.get("channelId"));
                // Integer -> Long    ==  Integer -> String -> Long
                submit.setFee(Long.parseLong( map.get("fee") + ""));
                break;
            }
        }

        return true;
    }
}
